//
// Created by ASUS on 2024/4/12/0012.
//
/*
给你一个轴对齐的二维数组 rectangles 。 对于 rectangle[i] = [x1, y1, x2, y2]，其中（x1，y1）是矩形 i 左下角的坐标， (xi1, yi1) 是该矩形 左下角 的坐标， (xi2, yi2) 是该矩形 右上角 的坐标。
计算平面中所有 rectangles 所覆盖的 总面积 。任何被两个或多个矩形覆盖的区域应只计算 一次 。
返回 总面积 。因为答案可能太大，返回 109 + 7 的 模 。
示例 1：
输入：rectangles = [[0,0,2,2],[1,0,2,3],[1,0,3,1]]
输出：6
解释：如图所示，三个矩形覆盖了总面积为 6 的区域。
从(1,1)到(2,2)，绿色矩形和红色矩形重叠。
从(1,0)到(2,3)，三个矩形都重叠。
示例 2：
输入：rectangles = [[0,0,1000000000,1000000000]]
输出：49
解释：答案是 1018 对 (10^9 + 7) 取模的结果， 即 49 。
提示：
1 <= rectangles.length <= 200
rectanges[i].length = 4
0 <= xi1, yi1, xi2, yi2 <= 10^9
 */
#include <bits/stdc++.h>
using namespace std;
const int mod = 1e9 + 7;

int rectangleArea(vector<vector<int>> rectangles={{0,0,2,2},{1,0,2,3},{1,0,3,1}}) {
	vector<int> x_pos;
	for(auto&r:rectangles){
		x_pos.push_back(r[0]);
		x_pos.push_back(r[2]);
	}
	sort(x_pos.begin(),x_pos.end());
	long long ans=0;
	for(int i=1;i<x_pos.size();i++){
		int a=x_pos[i-1],b=x_pos[i],len=b-a;
		if(len==0) continue;
		vector<vector<int>> lines;
		for(auto&r:rectangles){
			if(r[0]<=a&&b<=r[2]) lines.push_back({r[1],r[3]});
		}
		sort(lines.begin(), lines.end());
		long long tot=0,l=-1,r=-1;
		for(auto&cur:lines){
			if(cur[0]>r){
				tot+=r-l;
				l=cur[0];
				r=cur[1];
			}else if(cur[1]>r){
				r=cur[1];
			}
		}
		tot+=r-l;
		ans=(ans+tot*len)%mod;
	}
	return (int)ans;
}

int main(){
	cout<<rectangleArea();
	return 0;
}